#define _CRT_SECURE_NO_WARNINGS 1 
#include<iostream>
using namespace std;
class Solution {
public:
    int myAtoi(string str)
    {
        bool sign = true;   //默认为正数

        // 跳过开头可能存在的空格
        int i = 0;
        while (i < str.size() && str[i] == ' ')
        {
            i++;
        }

        //接着判断首个字符是否为正负号
        if (str[i] == '-')
        {
            sign = false;  // 该字符串为负数，移至下一个字符接着判断
            i++;
        }
        else if (str[i] == '+')  // 字符串为正数，sign已经默认为true，直接移动到下一位即可
            i++;

        //下面开始对非正负符号位进行判断
        if (str[i] < '0' || str[i] > '9') // 正常数字第一位不能是0，必须为1~9之间的数字，否则就是非法数字
            return 0;

        int res = 0;   //这里res用的int型，需要更加仔细考虑边界情况，但如果用long的话可以省去一些麻烦
        int num = 0;
        int border = INT_MAX / 10;  // 用来验证计算结果是否溢出int范围的数据
        while (i < str.size())
        {

            // 遇到非数字字符，则返回已经计算的res结果
            if (str[i] < '0' || str[i] > '9')

                break;

            // 注意这句话要放在字符转换前，因为需要验证的位数比实际值的位数要少一位, 这里比较巧妙的地方在于
            // 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 
            // 2. 将超过最大值和低于最小值的情况都包括了
            if (res > border || res == border && str[i] > '7')
                return sign == true ? INT_MAX : INT_MIN;

            //开始对数字字符进行转换
            num = str[i] - '0';
            res = res * 10 + num;
            i++;
        }

        //最后结果根据符号添加正负号
        return sign == true ? res : -res;
    }
};


int myAtoi(string str) {
    int res = 0;
    int bndry = INT_MAX / 10;
    int flag = 1;
    int length = str.length();
    if (length == 0)
        return 0;
    int i = 0;
    while (i < length && str[i] == ' ')
        i++;
    if (str[i] == '-' || str[i] == '+') {
        str[i] == '-' ? flag = -1 : flag = 1;
        i++;
    }
    for (int j = i; j < length; j++) {
        if (str[j] < '0' || str[j] > '9')
            break;
        if (res > bndry || res == bndry && str[j] > '7')
            return flag == 1 ? INT_MAX : INT_MIN;
        res = res * 10 + (str[j] - '0');
    }
    return flag * res;
}